home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / mig / MigOpenPdev.c < prev    next >
C/C++ Source or Header  |  1990-09-24  |  3KB  |  126 lines

  1. /* 
  2.  * MigOpenPdev.c --
  3.  *
  4.  *    This file contains the MigOpenPdev procedure, which
  5.  *    opens the pseudo-device that communicates with
  6.  *    either the global server or the local daemon.
  7.  *
  8.  * Copyright 1990 Regents of the University of California
  9.  * Permission to use, copy, modify, and distribute this
  10.  * software and its documentation for any purpose and without
  11.  * fee is hereby granted, provided that the above copyright
  12.  * notice appear in all copies.  The University of California
  13.  * makes no representations about the suitability of this
  14.  * software for any purpose.  It is provided "as is" without
  15.  * express or implied warranty.
  16.  */
  17.  
  18. #ifndef lint
  19. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/MigOpenPdev.c,v 2.3 90/09/24 14:46:50 douglis Exp $ SPRITE (Berkeley)";
  20. #endif not lint
  21.  
  22. #include <fs.h>
  23. #include <stdio.h>
  24. #include <sys/file.h>
  25. #include <mig.h>
  26. #include "migInt.h"
  27.  
  28. extern int errno;
  29. extern char *strerror();
  30.  
  31. /* 
  32.  * Define the global variables that refer to the pdevs used.  Initialize
  33.  * them to -1 to indicate they haven't been opened.
  34.  */
  35. int mig_GlobalPdev = -1;
  36. int mig_LocalPdev = -1;
  37.  
  38.  
  39. /*
  40.  *----------------------------------------------------------------------
  41.  *
  42.  * MigOpenPdev --
  43.  *
  44.  *    Open the specified pseudo-device.  If global
  45.  *    is non-zero, open the global pdev, else
  46.  *    open the pdev for this host.
  47.  *
  48.  * Results:
  49.  *    If successful, 0 is returned. If an error is encountered,
  50.  *    then -1 is returned and errno indicates the error.
  51.  *
  52.  * Side effects:
  53.  *    One of the global variables defined above is updated to
  54.  *    store the descriptor.  This variable is used in subsequent
  55.  *    accesses.  Also, if we give up after exceeding the maximum
  56.  *     number of retries, we set a flag so in the future we only
  57.  *    try once rather than going through the full sleep-open-sleep
  58.  *     ritual.
  59.  *
  60.  *----------------------------------------------------------------------
  61.  */
  62. int
  63. MigOpenPdev(global)
  64.     int global;            /* Whether to open the global pdev. */
  65. {
  66.     int desc;
  67.     char *name;
  68.     int retries;
  69.     int sleepTime;
  70.     static int gaveUp = 0;
  71.     
  72.  
  73.     if (global) {
  74.     /*
  75.      * Assume no hosts are assigned to us, and that any hosts previously
  76.      * assigned have been revoked.
  77.      */
  78.     MigHostCache(0, MIG_CACHE_REMOVE_ALL, TRUE);
  79.     }
  80.     name = Mig_GetPdevName(global);
  81.     if (name == (char *) NULL) {
  82.     fprintf(stderr,
  83.            "MigOpenPdev: Error getting name of pdev to open: %s.\n",
  84.            strerror(errno));
  85.     fflush(stderr);
  86.     return(-1);
  87.     }
  88.     desc = open(name, O_RDONLY, 0);
  89.     if (desc < 0) {
  90.     if (!gaveUp) {
  91.         gaveUp = 1;
  92.         fprintf(stderr,
  93.            "MigOpenPdev: Error opening pdev %s (still trying): %s.\n",
  94.            name, strerror(errno));
  95.         fflush(stderr);
  96.         for (retries = 0, sleepTime = 1;
  97.          retries < MIG_DAEMON_RETRY_COUNT;
  98.          retries++, sleepTime *= 2) {
  99.         sleep(sleepTime);
  100.         desc = open(name, O_RDONLY, 0);
  101.         if (desc >= 0) {
  102.             fprintf(stderr,
  103.                 "MigOpenPdev: Succeeded in opening pdev.\n");
  104.             fflush(stderr);
  105.             break;
  106.         }
  107.         }
  108.         if (retries == MIG_DAEMON_RETRY_COUNT) {
  109.         fprintf(stderr,
  110.                "MigOpenPdev: Unable to contact daemon.\n");
  111.         fflush(stderr);
  112.         return(-1);
  113.         }
  114.     } else {
  115.         return(-1);
  116.     }
  117.     }
  118.     if (global) {
  119.     mig_GlobalPdev = desc;
  120.     } else {
  121.     mig_LocalPdev = desc;
  122.     }
  123.     gaveUp = 0;
  124.     return(0);
  125. }
  126.